/*
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.schema.domain.thing.creativeWork;

import java.net.URL;
import java.util.Date;
import org.schema.domain.thing.CreativeWork;
import org.schema.domain.thing.Place;
import org.schema.domain.thing.creativeWork.article.NewsArticle;
import org.schema.domain.thing.intangible.quantity.Distance;
import org.schema.domain.thing.intangible.quantity.Duration;

/**
 * An image, video, or audio object embedded in a web page. Note that a creative work may have many media objects associated with it on the same web page. For example, a page about a single song (MusicRecording) may have a music video (VideoObject), and a high and low bandwidth audio stream (2 AudioObject's).
 */
public interface MediaObject extends CreativeWork {

	/**
	 * A NewsArticle associated with the Media Object.
	 *
 	 * @return NewsArticle
	 */
	NewsArticle getAssociatedArticle();

	/**
	 * A NewsArticle associated with the Media Object.
	 *
 	 * @param newsArticle
	 * @return void
	 */
	void setAssociatedArticle(NewsArticle newsArticle);

	/**
	 * The bitrate of the media object.
	 *
 	 * @return String
	 */
	String getBitrate();

	/**
	 * The bitrate of the media object.
	 *
 	 * @param string
	 * @return void
	 */
	void setBitrate(String string);

	/**
	 * File size in (mega/kilo) bytes.
	 *
 	 * @return String
	 */
	String getContentSize();

	/**
	 * File size in (mega/kilo) bytes.
	 *
 	 * @param string
	 * @return void
	 */
	void setContentSize(String string);

	/**
	 * Actual bytes of the media object, for example the image file or video file.
	 *
 	 * @return URL
	 */
	URL getContentURL();

	/**
	 * Actual bytes of the media object, for example the image file or video file.
	 *
 	 * @param uRL1
	 * @return void
	 */
	void setContentURL(URL uRL1);

	/**
	 * The duration of the item (movie, audio recording, event, etc.) in ISO 8601 date format.
	 *
 	 * @return Duration
	 */
	Duration getDuration();

	/**
	 * The duration of the item (movie, audio recording, event, etc.) in ISO 8601 date format.
	 *
 	 * @param duration
	 * @return void
	 */
	void setDuration(Duration duration);

	/**
	 * A URL pointing to a player for a specific video. In general, this is the information in the src element of an embed tag and should not be the same as the content of the loc tag.
	 *
 	 * @return URL
	 */
	URL getEmbedURL();

	/**
	 * A URL pointing to a player for a specific video. In general, this is the information in the src element of an embed tag and should not be the same as the content of the loc tag.
	 *
 	 * @param uRL1
	 * @return void
	 */
	void setEmbedURL(URL uRL1);

	/**
	 * The creative work encoded by this media object
	 *
 	 * @return CreativeWork
	 */
	CreativeWork getEncodesCreativeWork();

	/**
	 * The creative work encoded by this media object
	 *
 	 * @param creativeWork
	 * @return void
	 */
	void setEncodesCreativeWork(CreativeWork creativeWork);

	/**
	 * mp3, mpeg4, etc.
	 *
 	 * @return String
	 */
	String getEncodingFormat();

	/**
	 * mp3, mpeg4, etc.
	 *
 	 * @param string
	 * @return void
	 */
	void setEncodingFormat(String string);

	/**
	 * Date the content expires and is no longer useful or available. Useful for videos.
	 *
 	 * @return Date
	 */
	Date getExpires();

	/**
	 * Date the content expires and is no longer useful or available. Useful for videos.
	 *
 	 * @param date1
	 * @return void
	 */
	void setExpires(Date date1);

	/**
	 * The height of the media object.
	 *
 	 * @return Distance
	 */
	Distance getHeight();

	/**
	 * The height of the media object.
	 *
 	 * @param distance
	 * @return void
	 */
	void setHeight(Distance distance);

	/**
	 * Player type required—for example, Flash or Silverlight.
	 *
 	 * @return String
	 */
	String getPlayerType();

	/**
	 * Player type required—for example, Flash or Silverlight.
	 *
 	 * @param string
	 * @return void
	 */
	void setPlayerType(String string);

	/**
	 * The regions where the media is allowed. If not specified, then it's assumed to be allowed everywhere. Specify the countries in ISO 3166 format.
	 *
 	 * @return Place
	 */
	Place getRegionsAllowed();

	/**
	 * The regions where the media is allowed. If not specified, then it's assumed to be allowed everywhere. Specify the countries in ISO 3166 format.
	 *
 	 * @param place
	 * @return void
	 */
	void setRegionsAllowed(Place place);

	/**
	 * Indicates if use of the media require a subscription  (either paid or free). Allowed values are yes or no.
	 *
 	 * @return Boolean
	 */
	Boolean getRequiresSubscription();

	/**
	 * Indicates if use of the media require a subscription  (either paid or free). Allowed values are yes or no.
	 *
 	 * @param boolean1
	 * @return void
	 */
	void setRequiresSubscription(Boolean boolean1);

	/**
	 * Date when this media object was uploaded to this site.
	 *
 	 * @return Date
	 */
	Date getUploadDate();

	/**
	 * Date when this media object was uploaded to this site.
	 *
 	 * @param date1
	 * @return void
	 */
	void setUploadDate(Date date1);

	/**
	 * The width of the media object.
	 *
 	 * @return Distance
	 */
	Distance getWidth();

	/**
	 * The width of the media object.
	 *
 	 * @param distance
	 * @return void
	 */
	void setWidth(Distance distance);

}